/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.marlboroug.authors;

import com.marlboroug.entity.Authors;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;


@Stateless
public class AuthorsManager implements AuthorsManagerRemote {

    @PersistenceContext(unitName = "Marlboroug-ejbPU")
    EntityManager em;
    
    /** Permet de créer un auteur
     * 
     * @param author Envoie un objet de type auteur
     * @return Un boolean pour confirmer la création
     */
    @Override
    public boolean create (Authors author) {       
        Boolean resultat = true; //Resultat de la recherche
        //On vérifie que username n'existe pas
        List<Authors> temp = findCreateAuthor(author.getName());
        for (Authors n : temp) {
            resultat = false;
        } 
        if(resultat){
            em.persist(author);
            return true;
        }else {
            return false;
        }
    }
    
    /** Permet de supprimer un auteur
     * 
     * @param ID_authors Envoie un ID d'un auteur
     * @return Un boolean pour confirmer la suppression
     */
    @Override
    public boolean delete (Long ID_authors) {
        Authors author = em.find(Authors.class, ID_authors);
        em.remove(author);
        Authors temp = find(ID_authors);
        return temp == null;
    }

    /** Permet de retourner un objet Authors en fonction d'un ID
     * 
     * @param ID_authors Un ID d'un auteur
     * @return Un objet auteur
     */
    @Override
    public Authors find (Long ID_authors) {
        Authors author = em.find(Authors.class, ID_authors);
        return author;
    }

    /** Permet de mettre à jour un auteur
     * 
     * @param author Envoie un objet auteur
     * @return Un boolean pour confirmer la modification
     */
    @Override
    public boolean update (Authors author) {
        //On vérifie que username n'existe pas
        Authors temp = find(author.getIDauthors());
        if(temp != null){
            em.merge(author);
            return true;
        }else {
            return false;
        }
    }

    /** Permet de retourner une liste d'auteurs en fonction d'un mot clés
     * 
     * @param pattern Un mot clés
     * @return Une liste d'auteurs
     */
    @Override
    public List<Authors> retrieveByName (String pattern) {
    pattern = "%" + pattern + "%";
    String q = "SELECT m FROM Authors m WHERE m.name LIKE :pattern";
    TypedQuery<Authors> query = em.createQuery(q, Authors.class);
    query.setParameter("pattern", pattern);
    List<Authors> author = query.getResultList();
    return author;
    }
    
    /** Permet de retourner un auteur en fonction d'un nom
     * 
     * @param pattern Un nom
     * @return Un auteur
     */
    @Override
    public List<Authors> findCreateAuthor (String pattern) {       
    String q = "SELECT m FROM Authors m WHERE m.name LIKE :pattern";
    TypedQuery<Authors> query = em.createQuery(q, Authors.class);
    query.setParameter("pattern", pattern);
    List<Authors> author = query.getResultList();
    return author;
    }
    
    /** Permet de retourner une liste des auteurs
     * 
     * @return Une liste d'auteurs
     */
    @Override
    public List<Authors> findAll () {       
    String q = "SELECT m FROM Authors m";
    TypedQuery<Authors> query = em.createQuery(q, Authors.class);
    List<Authors> author = query.getResultList();
    return author;
    }
}
